home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1996
/
MacHack 1996.toast
/
Presentations
/
Presentations ’94
/
Timothy Knox
/
Pocket6.3
/
Pocket DA
/
DA Source
/
dSupport.txt
< prev
next >
Wrap
Text File
|
1994-06-24
|
10KB
|
362 lines
; this file is dSupport.txt
; Mon Feb 15, 1988 10:22:13 menus
; Thu Feb 18, 1988 00:24:50 redo the control routine structure
; key events are now subroutines
; Wed Mar 30, 1988 13:37:36 opener routine
; Thu Apr 07, 1988 16:00:59 nested loads
; Mon Apr 18, 1988 14:06:37 restructure variables, echo, version, pblk in d4
; Mon Apr 25, 1988 15:10:34 macros
; Fri Apr 29, 1988 10:36:59 cursor change handler
; Sun May 01, 1988 10:40:36 fix emptyFS
; Tue May 10, 1988 01:28:38 ?terminal now writes event record to pad
; Sat Aug 08, 1992 19:26:00 remove xpect emitcode, add form
; ----- Mac Data ------
theWindow: DC.L 0 ; the DA's wptr & stuff
WContRect: DC.W 0,0
WSize: DC.W WHeight,WWidth
Activate: DC.W drop-base ; drop act/deact flag
Update: DC.W curs-base
Button: DC.W beep-base
YourMenu: DC.W menus-base
Runner: DC.W null-base
Closer: DC.W null-base
Version: DC.W doabout-base ; the about thingy
Opener: DC.W prompt-base ; open routine 3/30/88
Echo: DC.W -1
MyID: DC.W 0
KeyDown: DC.W inKey-base ; text input
Cursor: DC.W null-base
oldSSize: DC.W 0
oldStackH: DC.L 0
TextO: DC.L 0
TextE: DC.L 0
TextH: DC.L 0
FStack: DCB.L 5,0 ; text block handles
FOfsets: DCB.L 5,0 ; text block offsets
FEnds: DCB.L 5,0 ; text block ends
FSPtr: DC.W -4 ; file stack pointer
Events: DC.W return-base ; null event
DC.W buttDnEvt-base
DC.W return-base ; button up
DC.W keyDnEvt-base
DC.W return-base ; key up
DC.W keyDnEvt-base ; auto key
DC.W UpdateEvt-base
DC.W return-base ; disk inserted
DC.W ActivateEvt-base
Registers: DCB.L 6,0 ; save Dict/Counter/DP-IS/PS
PStackH: DC.L 0
oldKeyDown: DC.W 0 ; hold key handler addr during key
Scratch: DC.L 0
Menus: DC.W emenu-base
DC.W emenu-base
EMenu: DC.W beep-base ; undo
DC.W null-base ; -
DC.W beep-base ; cut
DC.W beep-base ; copy
DC.W paste-base ; paste
DC.W beep-base ; clear
; ----- Forth's Data ------
TermBuf: DCB.B 84,32 ; the input line buffer
IntA7: DC.L 0 ; applications rStack
RZero: DC.L 0 ; empty rStack
UFlow: DC.L 0 ; pstack underflow buffer (2bytes)
SZero: DC.L 0 ; empty pStack
Expand: DC.L 0 ; abs.addr in locked DRVR
FreePt: DC.W DictEnd-base ; "here"'s relative addr
FreeSz: DC.W base+32767-dictend ; number of bytes available
DictPt: DC.W task-theLink ; last word defined
NBase: DC.W 10 ; number base
Held: DC.W 0 ; HLD address
DoesAddr: DC.L 0 ; "does>" jump address
fcolon: DC.B 0 ; defining flag
fimmed: DC.B 0 ; immediate definition flag
fneg: DC.B 0 ; negative sign flag
fint: DC.B $80 ; key or clipboard
fmacro: DC.W 0 ; macro flag+filler
Form: DC.L $FFFF0007 ; decaform record
DictControl: ; ----- Control routine ------
JSR SetFRegs ; set the Forth registers
MOVE.L A7,IntA7-base(BP) ; put return address in IntA7
SUBA.L #16,A7 ; allocate a underflow buffer
MOVE.L A7,Rzero-base(BP)
MOVE.L theWindow-base(BP),-(SP)
_SetPort ; set this window
MOVE.L D4,A0 ; A0 has the param block's address
MOVE csCode(A0),D0 ; d0 has the message
; Event Message
CMPI #accEvent,D0 ; event message?
BNE.S @0
MOVEA.L csEvent(A0),A0 ; get the event record
MOVE evtNum(A0),D0 ; get event in D0
ANDI #$0F,D0
ADD D0,D0
LEA Events-base(BP),A1 ; jump to: ...
MOVE 0(A1,D0.W),D0 ; ... ActivateEvt, ButtDnEvt, ...
JMP 0(BP,D0.W) ; ... UpDateEvt or KeyDnEvt
; Idle Message
@0: CMPI #accRun,D0 ; periodic run message?
BNE.S @1
MOVE Runner-base(BP),D0
BRA.S @5 ; jump to the idle handler
; cursor message
@1: CMPI #accCursor,D0 ; change cursor message?
BNE.S @2
MOVE cursor-base(BP),D0
BRA.S @5 ; jump to the cursor handler
; Menu Message
@2: CMPI #accMenu,D0 ; menu message
BNE.S @3
MOVE csMenu(A0),D0 ; D0 has the item number
SUBQ #1,D0 ; D0 has the item index
ADD D0,D0 ; D0 has menu list offset
MOVE Yourmenu-base(BP),D1 ; D1 has menus relative addr
BRA.S @4 ; execute the menu
; Edit message
@3: CMPI #accUndo,D0 ; edit menu message?
BMI.S return
SUBI #accUndo,D0 ; normalize message# to 0-5
ADD D0,D0 ; D0 has offset into emenu
MOVE Yourmenu-base(BP),D1 ; D1 has menus relative addr
ADDQ #2,D1 ; D1 has menus+2 rel addr
@4: MOVE 0(BP,D1.W),D1 ; D1 has emenu rel addr
ADD D1,D0 ; D0 has emenu+offset rel addr
MOVE 0(BP,D0.W),D0 ; D0 has the handler' rel addr
@5: JSR 0(BP,D0.W) ; execute subroutine
Return: JSR SaveFRegs-base(BP) ; save the current forth registers
MOVE.L IntA7-base(BP),A7 ; restore the return address
RTS ; and go back to the DRVR
; First Line Event Handlers
ActivateEvt:
MOVE evtMeta(A0),-(PS)
ANDI #1,(PS)
MOVE Activate-base(BP),D0
BRA.S revt
ButtDnEvt:
MOVE Button-base(BP),D0
revt: JSR 0(BP,D0.W)
BRA.S return
UpDateEvt:
MOVE.L thewindow-base(BP),-(SP)
MOVE.L (SP),-(SP)
_BeginUpdate
MOVE update-base(BP),D0
JSR 0(BP,D0.W)
_EndUpdate
BRA.S return
KeyDnEvt:
MOVE.W evtASCII(A0),-(PS) ; push key data
MOVE Keydown-base(BP),D0
JSR 0(BP,D0.W) ; jump to the vector
kDone: BSR.S Curs ; draw the cursor
BRA.S return
; Un-named subroutines
SaveFRegs:
LEA Registers-base(BP),A0
MOVEM.L D6-D7/A2-A4/A6,(A0)
RTS
SetFRegs: ; restore the forth registers
LEA Registers,A0
MOVEM.L (A0),D6-D7/A2-A4/A6
RTS
TextNormal:
_PenNormal ; 1X1, black, patcopy
MOVE #4,-(SP) ; Monaco
_TextFont
MOVE #0,-(SP) ; plain text
_TextFace
MOVE #9,-(SP) ; 9 point
_TextSize
MOVE #0,-(SP) ; srcCopy
_TextMode
RTS
NoCurs: MOVE #10,-(SP) ; SrcXor mode
_PenMode
Curs: MOVE.L #$00000006,-(SP) ; move 6 pixels to the right
_Move
MOVE.L #$0000FFFA,-(SP) ; draw 6 pixels to the left
_Line
_PenNormal
RTS
altKey: BSR.S TextNormal ; font, mode, size etc
BSR.S NoCurs ; erase the cursor
MOVE oldKeyDown-base(BP),KeyDown-base(BP) ; set old key vector
BSR.S RestoreRStack ; put pforth addrs on rstack
MOVE.L oldStackH-base(BP),A0
MOVEQ #0,D0
_SetHandleSize ; shrink old stack data block
ANDI #$FF,(PS) ; mask out ascii
RTS ; return from "key"
RestoreRStack:
MOVE.L (SP)+,A1 ; save calling address
MOVE.L oldStackH-base(BP),A0
MOVE.L (A0),A0 ; get addr of old stack data block
MOVEQ #0,D0
MOVE oldSSize-base(BP),D0 ; get size of block to move
ADD.L D0,A0
@0: MOVE.L -(A0),-(SP)
SUBQ.L #4,D0
BGT.S @0
JMP (A1) ; return to calling address
QTCode: ; "?terminal" code
CLR -(SP) ; ?terminal's routine
MOVE #40,-(SP) ; test just for keypresses
PEA 40(DP) ; put the data at 'pad'
_EventAvail
MOVE (SP)+,-(PS)
MOVE.L #$0000FFFF,D0
_FlushEvents ; all events out!
RTS
KeyCode: ; "key" code
MOVE.L RZero-base(BP),D5
SUB.L SP,D5
MOVEQ #0,D0
MOVE D5,D0
MOVE D0,oldSSize-base(BP) ; set old stack size
MOVE.L oldStackH-base(BP),A0
_SetHandleSize
MOVE.L (A0),A0 ; A0 points to old stack data block
@0: MOVE.L (SP)+,(A0)+ ; save RStack
SUBQ #4,D5
BGT.S @0
MOVE KeyDown-base(BP),oldKeyDown-base(BP) ; save the old keydown
MOVE #altKey-base,keydown-base(BP) ; reset key handler
JMP kDone-base(BP) ; return to application
ClearTermBuf:
MOVEQ #76,D0
LEA TermBuf-base(BP),IS
@0: MOVE.L #$20202020,0(IS,D0) ; fill line buffer with blanks
SUBQ.B #4,D0
BGE.S @0
RTS
EmptyFS: ; clear pending loads from the file stack
TST fsptr-base(BP)
BMI.S @1
LEA fstack-base(BP),A1
MOVE fsptr-base(BP),D0
MOVE.L 0(A1,D0),A0
CLR.L 0(A1,D0)
MOVE.L A0,D1 ; dont try to dispose of nil handle*
BEQ.S @0 ; *
CMPA.L TextH-base(BP),A0
BEQ.S @0
_DisposHandle
@0: SUBQ #4,fsptr-base(BP)
BRA.S emptyfs
@1: RTS
Paste: JSR nocurs-base(BP)
CLR.L -(SP)
MOVE.L TextH-base(BP),-(SP) ; handle to the scrap data
MOVE.L #'TEXT',-(SP)
PEA TextO-Base(BP)
_GetScrap
MOVE.L (SP)+,TextE-base(BP) ; put the length at TextE
MOVE.L TextH-base(BP),A0 ; get a handle to the scrap data
MOVE.L (A0),D0 ; derefrence the scrap handle
MOVE.L D0,TextO-base(BP) ; set TextO to start of scrap data
ADD.L D0,TextE-base(BP) ; set TextE to end of scrap data
_HLock ; don't let data move during paste
CLR fsptr-base(BP)
MOVE.L TextH-base(BP),fstack-base(BP)
MOVE.L TextO-base(BP),fofsets-base(BP)
MOVE.L TextE-base(BP),fends-base(BP)
go: CLR.B fint-base(BP) ; leave keyboard mode
JMP CRet-base(BP) ; get next line
Pasting:
JSR ClearTermBuf-base(BP)
CLR.L D5 ; clear the character count
CLR.L D0 ; and the character
MOVE.L TextO-base(BP),A0 ; set the input address
@0: MOVE.B 0(A0,D5.W),D0 ; BEGIN get a character
CMP.B #CR,D0 ; is it not a CR?
BEQ.S @1
CMPI.B #78,D5 ; or 78 characters in buffer
BGE.S @1 ; WHILE
MOVE.B D0,0(IS,D5) ; stash it into buffer
ADDQ.B #1,D5 ; increment count
BRA.S @0 ; REPEAT
@1: ADDQ.B #1,D5 ; increment count
MOVE.B #CR,0(IS,D5) ; stash CR into buffer
MOVE D5,D0 ; preserve count for TYPE
ADD.L TextO-base(BP),D0
MOVE.L D0,TextO-base(BP) ; TextO=TextO+char.count
CMP.L TextE-base(BP),D0 ; IS the block done (TextO≥TextE)?
BMI.S tandr ; just type and return if not.
MOVE fsptr-base(BP),D0
LEA fstack-base(BP),A0
MOVE.L 0(A0,D0.W),A0
_HUnlock ; unlock the block
CMPA.L TextH-base(BP),A0
BEQ.S @2 ; keep the scrap block
_DisposHandle ; dispose of loaded blocks
@2: SUBQ #4,fsptr-base(BP) ; pop fstack
BMI.S @3 ; branch if no pending loads
MOVE fsptr-base(BP),D0
LEA fofsets-base(BP),A0 ; set TextO to (fofsets+fsptr)
MOVE.L 0(A0,D0.W),TextO-base(BP)
LEA fends-base(BP),A0
MOVE.L 0(A0,D0.W),TextE-base(BP)
BRA.S tandr
@3: BSET.B #7,fint-base(BP) ; set keyboard mode
tandr: TST echo-base(BP)
BNE.S @4
RTS
@4: JSR tib-base(BP)
MOVE D5,-(PS)
JSR type-base(BP)
JMP doCR-base(BP) ; TIB count TYPE CR ;
DoAbout:
CLR.L -(SP)
MOVE.L #'p4TH',-(SP)
MOVE myid-base(BP),-(SP) ; Resource ID of p4TH
_GetResource
MOVE.L (SP),A0
MOVE.L (A0),-(SP) ; text address
_DrawString
_ReleaseResource
JMP docr-base(BP)